package com.itheima.cen;

import javax.swing.*;
import java.util.Random;

/*
 *      二维数组优化图片展示
 *          以及打乱16张图片
 *
 *
 * */
//注意类名
public class Game04 {
    /* //主程序的入口,main方法
     public static void main(String[] args) {
         //窗体对象
         JFrame jf = new JFrame();
         //相关设置
         jf.setTitle("动漫美女拼图: 图片展示");
         jf.setSize(380, 400);
         jf.setDefaultCloseOperation(3);
         jf.setLocationRelativeTo(null);
         jf.setAlwaysOnTop(true);
         //取消默认布局
         jf.setLayout(null);

         //定义一个二维数组
         //用于表示图片的编号,打乱其实就是打乱加载时的图片
         int[][] dates = {
                 {1, 2, 3, 4},
                 {5, 6, 7, 8},
                 {9, 10, 11, 12},
                 {13, 14, 15, 16}
         };

         //注意,打乱一定要在添加之前,否则,没效果

         //创建随机数对象
         Random random = new Random();
         //打乱数组
         //遍历数组
         for (int i = 0; i < dates.length; i++) {
             for (int j = 0; j < dates[i].length; j++) {
                 //获取两个随机索引值
                 int x = random.nextInt(dates.length);
                 int y = random.nextInt(dates[x].length);

                 //交换数据
                 int temp = dates[i][j];
                 dates[i][j] = dates[x][y];
                 dates[x][y] = temp;
             }
         }

         //遍历二维数组进行加载图片
         for (int i = 0; i < dates.length; i++) {
             for (int j = 0; j < dates[i].length; j++) {
                 //创建一个标签对象
                 JLabel jLabel = new JLabel(new ImageIcon("day08\\imgs\\" + dates[i][j] + ".png"));
                 //设置大小
                 jLabel.setBounds(j * 90, i * 90, 90, 90);
                 //添加到窗体中
                 jf.add(jLabel);
             }
         }

         //设置窗体可见
         jf.setVisible(true);
     }*/
    //程序的注入口,也是程序开始的地方,main方法
    public static void main(String[] args) {
        //窗体对象
        JFrame jf = new JFrame();
        //相关设置
        jf.setTitle("动漫美女拼图: 图片展示");
        jf.setSize(380, 400);
        jf.setDefaultCloseOperation(3);
        jf.setLocationRelativeTo(null);
        jf.setAlwaysOnTop(true);
        //取消默认布局
        jf.setLayout(null);
        //定义一个二维数组
        //用于表示图片的编号,打乱其实就是打乱加载时的图片
        int[][] dates = {
                {1, 2, 3, 4},
                {5, 6, 7, 8},
                {9, 10, 11, 12},
                {13, 14, 15, 16}
        };
        //创建随机数对象
        Random random = new Random();
        //遍历二维组,做交换操作
        for (int i = 0; i < dates.length; i++) {
            for (int j = 0; j < dates[i].length; j++) {
                //获取两个随机索引
                int x = random.nextInt(dates.length);
                int y = random.nextInt(dates[x].length);
                //进行数据交换
                swap(dates, i, j, x, y);
            }
        }
        //遍历数组加载图片
        for (int i = 0; i < dates.length; i++) {
            for (int j = 0; j < dates[i].length; j++) {
                JLabel jLabel = new JLabel(new ImageIcon("day08\\imgs\\" + (dates[i][j]) + ".png"));
                //设置大小与位置
                jLabel.setBounds(i * 90, j * 90, 90, 90);
                //添加到窗体中
                jf.add(jLabel);
            }
        }
        //设置窗体可见
        jf.setVisible(true);

    }

    //定义一个方法,用于数据交换
    //两个明确 1.参数列表 2.返回值类型
    //分析: 需要两个减缓的数据 不需要返回值类型 要多数组修改就需要数组,否则改的副本
    public static void swap(int[][] array, int index1, int index2, int index3, int index4) {
        int temp = array[index1][index2];  // 通过索引直接读取数组的值
        array[index1][index2] = array[index3][index4];  // 通过索引直接修改数组
        array[index3][index4] = temp;
    }


    //定义一个方法,用于遍历二维数组
    //两个明确 1.参数列表 2.返回值类型
    //分析 需要一个二维数组作为原材料 不许要返回值类型
    public static void printArray(int[][] arr) {
        //遍历
        //先遍历二维数组中的一维数组
        for (int i = 0; i < arr.length; i++) {
            //在遍历一维数组中的元素
            for (int j = 0; j < arr[i].length; j++) {
                //对一维数组中的元素进行打印
                System.out.print(arr[i][j] + " ");
            }
            //没遍历完一个一维数组,就换一行
            System.out.println();
        }
    }
}
